SRP
單一類別的複雜度降低,因為要實現的職責都很清晰明確的定義,這將大幅提升可讀性與可維護性。
如果有做好 SRP ,那修改只會對同一個介面或類別有影響,這對擴展性和維護性都有很大的幫助。
class AnimalDB:
def get_animal(self, id):
print("抓到動物資料")
return
def save(self, name, id):
print("成功儲存動物資料")
return
class Animal:
def __init__(self, name, id):
self.name = name
self.id = id
def get_name(self):
return print(self.name)
def get_data(self):
return AnimalDB().get_animal(self.id)
def save(self):
return AnimalDB().save(self.name, self.id)
dog = Animal("dog", 1)
dog.get_name()
dog.get_data()
dog.save()
OCP
開放 擴充 的可能性
封閉 修改 的可能性
降低修改風險。
OCP跟DIP都是討論抽象概念,可以利用DIP方法來達成降低耦合進而遵循OCP,如果利用多型方法來實現,則需要遵守LSP,可以保證子類別的可替換性,來達到無需修改就可以擴展
from abc import ABCMeta, abstractmethod
from cmath import pi
class Calculate(metaclass=ABCMeta):
@abstractmethod
def get_area(self):
pass
class Square(Calculate):
def __init__(self, h, w):
self.h = h
self.w = w
def get_area(self):
print(self.h * self.w)
class Circle(Calculate):
def __init__(self, r):
self.r = r
def get_area(self):
print(self.r * self.r * pi)
square = Square(3,3)
square.get_area()
circle = Circle(2)
circle.get_area()
LSP
當子類別替換替換掉父類別時,其功能不受影響
子類別處理不同的業務邏輯,參數定義使用父類別,實際上傳遞的是子類別,這樣就能同份定義,執行不同的業務邏輯。
class Father:
def apple(self):
return 20
class Son:
def apple(self):
return 40
class Customer(Father):
def buy_apple(self):
return self.apple()
customers = Customer()
print(customers.buy_apple())